package com.gandong8.tablestore.tool.core;


import com.alicloud.openservices.tablestore.TunnelClient;
import com.alicloud.openservices.tablestore.tunnel.worker.TunnelWorker;
import com.alicloud.openservices.tablestore.tunnel.worker.TunnelWorkerConfig;
import com.gandong8.tablestore.tool.service.inter.TablestoreService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;


/**
 * 通道服务
 * 数据消费框架原理: https://help.aliyun.com/document_detail/107985.html
 * SDK实例：https://help.aliyun.com/document_detail/102495.htm
 * 通道类型：
 *  全量: 会根据全量数据大小自动划分多个通道分区，支持多客户端同时去消费，单机会开启多线程处理，
 *  增量：如果数据只有一个分区，不支持同时消费。（保证数据的顺序执行）
 *  全量+增量：会先执行全量数据，完成后再执行增量数据
 * 由于是程序处理完之后客户端再向tablestore提交偏移量，所以如果程序中途crash，数据下次还是会推送过来。
 *
 * 注意：就算主键按数据散列方式设计，tablestore默认还是一个分区，只有数据大小达到一定的量级(20G左右),才会去自动分区。
 *  自动创建分区的时候tablestore可能会抽风下（[ErrorCode]:OTSInternalServerError）
 *
 */
@Service
@Slf4j
public class TsTunnel {

    @Autowired
    TablestoreService tablestoreService;

    @Autowired
    TunnelClient tunnelClient;

    private void process(String tunnelId, Class<?> sourceObj, Class<?>  targetObj) {
        TunnelWorkerConfig config = new TunnelWorkerConfig(new TsProcessor(tablestoreService, tunnelId, sourceObj));
        TunnelWorker worker = new TunnelWorker(tunnelId, tunnelClient, config);
        try {
            worker.connectAndWorking();
        } catch (Exception e) {
            log.error("TsTunnelException:{}", tunnelId, e);
            worker.shutdown();
            tunnelClient.shutdown();
        }
    }


}
